/**
 * 用于文件及文件夹操作的工具类
 */
package guet.imagan.util;

import java.io.File;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 文件操作工具类
 */
public class FileUtil {
	/**
	 * 返回一个文件名中的扩展名
	 * @param fileName 文件名，例如：c:\\test\\main.py
	 * @return 扩展名
	 */
	public static String getFileExtension(String fileName) {
		int dotInd = fileName.lastIndexOf(".");
		return fileName.substring(dotInd + 1).toLowerCase();
	}

	/**
	 * @see guet.imagan.util.FileUtil#getFileExtension(String)
	 */
	public static String getFileExtension(File file){
		return getFileExtension(file.getName());
	}

	/**
	 * 返回表示文件完整路径的文件的基本名。
	 * @param fileName 文件名，例如：c:\\test\\test.py,其基本名为test
	 * @return 文件基本名
	 */
	public static String getFileBasicName(String fileName){
		int dotPos = fileName.lastIndexOf(".");
		int slashPos = fileName.lastIndexOf("\\");
		String res;
		if(dotPos!=-1)
			res = fileName.substring(slashPos+1,dotPos);
		else
			res = fileName.substring(slashPos+1);
		return res;
	}

	/**
	 * @see guet.imagan.util.FileUtil#getFileBasicName(String)
	 */
	public static String getFileBasicName(File file){
		return getFileBasicName(file.getAbsolutePath());
	}

	/**
	 * 查找指定目录下，扩展名处于指定范围的所有文件
	 * @param result 结果文件列表
	 * @param dir 待查找的目录，该方法不对dir是否为目录进行判断，请自行判断
	 * @param ext 扩展名列表
	 */
	public static void findFiles(List<File>result,File dir,List<String>ext){
		File[] files = dir.listFiles();
		if(files==null) {
			return;
		}
		for(File f:files){
			if(f.isDirectory()) {
				findFiles(result, f, ext);
			}else if(f.isFile()) {
				if (ext.contains(getFileExtension(f))) {
					result.add(f);
				}
			}
		}
	}

	/**
	 * 返回所有文件对应的文件路径列表
	 * @param files 文件集合
	 * @return 文件路径列表
	 */
	public static List<String> getPathsOfFiles(List<File>files){
		List<String>result = new ArrayList<>();
		files.forEach(f->result.add(f.getAbsolutePath()));
		return result;
	}

	/**
	 * 返回文件列表中文件的基本名列表
	 * @param files 文件列表
	 * @return 文件基本名构成的列表
	 */
	public static List<String> getBasicNames(List<File> files) {
		List<String>  baseNames = new LinkedList<>();
		files.forEach(f->{
			baseNames.add(getFileBasicName(f));
		});
		return baseNames;
	}

	/**
	 * 返回文件列表中的文件相对于1个目录的相对路径字符串
	 * @param dir 目录
	 * @param files 文件
	 * @return 相对路径字符串列表
	 */
	public static List<String> getRelativePath(File dir, List<File> files) {
		List<String> result = new LinkedList<>();
		files.forEach(f->{
			result.add(getRelativePath(dir,f));
		});
		return result;
	}

	/**
	 * 返回一个文件相对于另一个目录的相对路径
	 * @param dir 目录
	 * @param file 文件
	 * @return 若该文件是另一个目录或其子目录下的文件，则返回相对路径字符串，否则，返回文件自身完整路径
	 */
	public static String getRelativePath(File dir,File file){
		String dirStr=dir.getAbsolutePath();
		String fileStr= file.getAbsolutePath();
		if(!fileStr.startsWith(dirStr))
			return fileStr;
		int startPos= dirStr.length();
		String res = fileStr.substring(startPos);
		if(res.startsWith(File.separator)){
			res = res.substring(1);
		}
		return res;
	}
}
